﻿using CLM.Gestao.Interfaces;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace CLM.Gestao.Administrador.UI
{
    public partial class Produtos : Form, IFormulario
    {
        #region Propriedades e Variáveis

        BLL.Produto Produto = new BLL.Produto();

        //Lista para armazenar os objetos apresentados na interface
        List<BLL.Produto.Lista> ListaProdutos;

        //Objeto utilizado para armazenas os valores novos ou de alteração de um registro
        BLL.Produto.Lista ProdutoSelecionado = null;

        //Objeto utilizado para filtros
        BLL.Produto.Lista ProdutoFiltro = null;

        //Objeto para controle do Estado da interface
        Util.Estado Estado = Util.Estado.Nenhum;

        #endregion

        #region Construtor

        public Produtos()
        {
            try
            {
                InitializeComponent();
                var pos = this.PointToScreen(lblTitulo.Location);
                pos = picTitulo.PointToClient(pos);
                lblTitulo.Parent = picTitulo;
                lblTitulo.Location = pos;
                lblTitulo.BackColor = Color.Transparent;

                InicializaGrid();
                InicializaCombos();
                ConfiguraInterface(Util.Estado.Nenhum);
                Limpar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #endregion Contrutor

        #region Eventos

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                Buscar();
                ConfiguraInterface(Util.Estado.Consulta);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnIncluir_Click(object sender, EventArgs e)
        {
            try
            {
                ProdutoSelecionado = new BLL.Produto.Lista();
                ConfiguraInterface(Util.Estado.Inclusao);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                ValidarInterface();
                AtualizaObjeto();
                Salvar();

                if (dgvProdutos.DataSource == null)
                    CarregaObjetoFiltro();

                Cancelar();
                Buscar();

                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                Cancelar();
                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("Tem certeza que deseja excluir o produto?", "Atenção", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                {
                    Excluir();
                    Cancelar();
                    Buscar();

                    ConfiguraInterface(Util.Estado.Nenhum);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnLimpar_Click(object sender, EventArgs e)
        {
            try
            {
                Limpar();
                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        private void btnExportar_Click(object sender, EventArgs e)
        {
            try
            {
                Exportar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void dgvProdutos_DoubleClick(object sender, EventArgs e)
        {
            try
            {
                ProdutoSelecionado = ListaProdutos[dgvProdutos.SelectedRows[0].Index];
                AtualizaInterface();
                ConfiguraInterface(Util.Estado.Alteracao);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnDriverRateio_Click(object sender, EventArgs e)
        {
            //DriverRateio frmDriverRateio = new DriverRateio();
            //frmDriverRateio.Show();
        }

        #endregion Eventos

        #region Métodos Públicos

        public void CarregaObjetoFiltro()
        {
            ProdutoFiltro = new BLL.Produto.Lista();
            if (!string.IsNullOrWhiteSpace(txtCodigoProduto.Text)) ProdutoFiltro.CodigoProduto = txtCodigoProduto.Text;
            if (!string.IsNullOrWhiteSpace(txtNomeProduto.Text)) ProdutoFiltro.NomeProduto = txtNomeProduto.Text;
            if (cboProdutoTipo.SelectedIndex > -1) ProdutoFiltro.IdProdutoTipo = ((BLL.ProdutoTipo.Itens)cboProdutoTipo.SelectedItem).IdProdutoTipo;
            if (cboProdutoPai.SelectedIndex > -1) ProdutoFiltro.IdProdutoPai = ((BLL.Produto.Itens)cboProdutoPai.SelectedItem).IdProduto;
            if (cboProdutoGlobal.SelectedIndex > -1) ProdutoFiltro.IdProdutoGlobal = ((BLL.ProdutoGlobal.Itens)cboProdutoGlobal.SelectedItem).IdProdutoGlobal;
            if (cboProdutoFamilia.SelectedIndex > -1) ProdutoFiltro.IdProdutoFamilia = ((BLL.ProdutoFamilia.Itens)cboProdutoFamilia.SelectedItem).IdProdutoFamilia;
            if (cboUnidadeNegocio.SelectedIndex > -1) ProdutoFiltro.IdUnidadeNegocio = ((BLL.UnidadeNegocio.Itens)cboUnidadeNegocio.SelectedItem).IdUnidadeNegocio;
        }

        public void InicializaCombos()
        {
            // Carrega o combo de Tipo de Produto
            BLL.ProdutoTipo ProdutoTipo = new BLL.ProdutoTipo();
            cboProdutoTipo.DataSource = ProdutoTipo.GetItens();
            cboProdutoTipo.DisplayMember = "NomeProdutoTipo";
            cboProdutoTipo.ValueMember = "IdProdutoTipo";

            // Carrega o combo de Produto Pai
            BLL.Produto Produto = new BLL.Produto();
            cboProdutoPai.DataSource = Produto.GetItens();
            cboProdutoPai.DisplayMember = "NomeProduto";
            cboProdutoPai.ValueMember = "IdProduto";

            // Carrega o combo de Produto Global
            BLL.ProdutoGlobal ProdutoGlobal = new BLL.ProdutoGlobal();
            cboProdutoGlobal.DataSource = ProdutoGlobal.GetItens();
            cboProdutoGlobal.DisplayMember = "NomeProdutoGlobal";
            cboProdutoGlobal.ValueMember = "IdProdutoGlobal";

            // Carrega o combo de Produto Família
            BLL.ProdutoFamilia ProdutoFamilia = new BLL.ProdutoFamilia();
            cboProdutoFamilia.DataSource = ProdutoFamilia.GetItens();
            cboProdutoFamilia.DisplayMember = "NomeProdutoFamilia";
            cboProdutoFamilia.ValueMember = "IdProdutoFamilia";

            // Carrega o combo de Unidade de Negócio
            BLL.UnidadeNegocio UnidadeNegocio = new BLL.UnidadeNegocio();
            cboUnidadeNegocio.DataSource = UnidadeNegocio.GetItens();
            cboUnidadeNegocio.DisplayMember = "NomeUnidadeNegocio";
            cboUnidadeNegocio.ValueMember = "IdUnidadeNegocio";
        }

        public void InicializaGrid()
        {
            dgvProdutos.AutoGenerateColumns = false;
            dgvProdutos.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dgvProdutos.Columns.Add(new DataGridViewColumn() { DataPropertyName = "CodigoProduto", HeaderText = "Código", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 50 });
            dgvProdutos.Columns.Add(new DataGridViewColumn() { DataPropertyName = "NomeProduto", HeaderText = "Nome", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 100 });
            dgvProdutos.Columns.Add(new DataGridViewColumn() { DataPropertyName = "NomeProdutoTipo", HeaderText = "Tipo de Produto", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 50 });
            dgvProdutos.Columns.Add(new DataGridViewColumn() { DataPropertyName = "NomeProdutoPai", HeaderText = "Produto Pai", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 50 });
            dgvProdutos.Columns.Add(new DataGridViewColumn() { DataPropertyName = "NomeProdutoGlobal", HeaderText = "Produto Global", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 50 });
            dgvProdutos.Columns.Add(new DataGridViewColumn() { DataPropertyName = "NomeProdutoFamilia", HeaderText = "Família de Produto", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 50 });
            dgvProdutos.Columns.Add(new DataGridViewColumn() { DataPropertyName = "NomeUnidadeNegocio", HeaderText = "Unidade de Negócio", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 50 });
        }

        public void ValidarInterface()
        {
            if (string.IsNullOrWhiteSpace(txtCodigoProduto.Text)) throw new Exception("O código é obrigatório.");
            if (string.IsNullOrWhiteSpace(txtNomeProduto.Text)) throw new Exception("O nome do produto é obrigatório.");
            if (cboProdutoTipo.SelectedIndex < 0) throw new Exception("Selecione o tipo de produto.");
            if (cboProdutoPai.SelectedIndex < 0) throw new Exception("Selecione o produto pai.");
            if (cboProdutoGlobal.SelectedIndex < 0) throw new Exception("Selecione o produto global.");
            if (cboProdutoFamilia.SelectedIndex < 0) throw new Exception("Selecione a família de produto.");
            if (cboUnidadeNegocio.SelectedIndex < 0) throw new Exception("Selecione a unidade de negócio.");
        }

        public void AtualizaObjeto()
        {
            ProdutoSelecionado.CodigoProduto = txtCodigoProduto.Text;
            ProdutoSelecionado.NomeProduto = txtNomeProduto.Text;
            ProdutoSelecionado.IdProdutoTipo = ((BLL.ProdutoTipo.Itens)cboProdutoTipo.SelectedItem).IdProdutoTipo;
            ProdutoSelecionado.IdProdutoPai = ((BLL.Produto.Itens)cboProdutoPai.SelectedItem).IdProduto;
            ProdutoSelecionado.IdProdutoGlobal = ((BLL.ProdutoGlobal.Itens)cboProdutoGlobal.SelectedItem).IdProdutoGlobal;
            ProdutoSelecionado.IdProdutoFamilia = ((BLL.ProdutoFamilia.Itens)cboProdutoFamilia.SelectedItem).IdProdutoFamilia;
            ProdutoSelecionado.IdUnidadeNegocio = ((BLL.UnidadeNegocio.Itens)cboUnidadeNegocio.SelectedItem).IdUnidadeNegocio;
        }

        public void AtualizaInterface()
        {
            txtCodigoProduto.Text = ProdutoSelecionado.CodigoProduto;
            txtNomeProduto.Text = ProdutoSelecionado.NomeProduto;

            if (ProdutoSelecionado.IdProdutoTipo > 0)
                cboProdutoTipo.SelectedValue = ProdutoSelecionado.IdProdutoTipo;
            else
                cboProdutoTipo.SelectedValue = -1;

            if (ProdutoSelecionado.IdProdutoPai > 0)
                cboProdutoPai.SelectedValue = ProdutoSelecionado.IdProdutoPai;
            else
                cboProdutoPai.SelectedValue = -1;

            if (ProdutoSelecionado.IdProdutoGlobal > 0)
                cboProdutoGlobal.SelectedValue = ProdutoSelecionado.IdProdutoGlobal;
            else
                cboProdutoGlobal.SelectedValue = -1;

            if (ProdutoSelecionado.IdProdutoFamilia > 0)
                cboProdutoFamilia.SelectedValue = ProdutoSelecionado.IdProdutoFamilia;
            else
                cboProdutoFamilia.SelectedValue = -1;

            if (ProdutoSelecionado.IdUnidadeNegocio > 0)
                cboUnidadeNegocio.SelectedValue = ProdutoSelecionado.IdUnidadeNegocio;
            else
                cboUnidadeNegocio.SelectedValue = -1;
        }

        public void Incluir()
        {
            Produto.Add(new List<BLL.Produto.Lista>() { ProdutoSelecionado });
            MessageBox.Show("Produto cadastrado com sucesso.");
        }

        public void Alterar()
        {
            Produto.Update(new List<BLL.Produto.Lista>() { ProdutoSelecionado });
            MessageBox.Show("Produto alterado com sucesso.");
        }

        public void Excluir()
        {
            Produto.Delete(new List<BLL.Produto.Lista>() { ProdutoSelecionado });
            MessageBox.Show("Produto excluído com sucesso.");
        }

        public void Cancelar()
        {
            txtCodigoProduto.Text = string.Empty;
            txtNomeProduto.Text = string.Empty;
            cboProdutoTipo.SelectedIndex = -1;
            cboProdutoPai.SelectedIndex = -1;
            cboProdutoGlobal.SelectedIndex = -1;
            cboProdutoFamilia.SelectedIndex = -1;
            cboUnidadeNegocio.SelectedIndex = -1;
        }

        public void Salvar()
        {
            switch (Estado)
            {
                case Util.Estado.Nenhum:
                    break;
                case Util.Estado.Inclusao:
                    Incluir();
                    break;
                case Util.Estado.Alteracao:
                    Alterar();
                    break;
                default:
                    break;
            }
        }

        public void Limpar()
        {
            Cancelar();
            ProdutoFiltro = null;
            dgvProdutos.DataSource = null;
        }

        public void Buscar()
        {
            if (ProdutoFiltro == null) CarregaObjetoFiltro();
            ListaProdutos = Produto.GetLista(ProdutoFiltro);
            dgvProdutos.DataSource = ListaProdutos;

            dgvProdutos.ClearSelection();
        }

        public void Exportar()
        {
            string FileName = string.Empty;

            SaveFileDialog sfdExportar = new SaveFileDialog();
            sfdExportar.Filter = "Arquivo Excel 2007-2010|*.xlsx|Arquivo Excel 97-2003|*.xls";
            sfdExportar.Title = "Salvar Arquivo";
            sfdExportar.FileName = "";
            if (sfdExportar.ShowDialog() == DialogResult.OK)
            {
                FileName = sfdExportar.FileNames[0];

                string[] Cabecalho = { "Código", "Nome", "Tipo de Produto", "Produto Pai", "Produto Global", "Família de Produto", "Unidade de Negócio" };
                List<string> ListaCampos = new List<string> { "CodigoProduto", "NomeProduto", "NomeProdutoTipo", "NomeProdutoPai", "NomeProdutoGlobal", "NomeProdutoFamilia", "NomeUnidadeNegocio" };
                Exportacao.Excel<BLL.Produto.Lista>.TipoExportacao = Exportacao.TipoExportacao.Exportacao;
                Exportacao.Excel<BLL.Produto.Lista>.Exportar(ListaProdutos, ListaCampos, Cabecalho, FileName, "Produtos");
            }
        }

        public void ConfiguraInterface(Util.Estado pEstado)
        {
            Estado = pEstado;

            if (pEstado == Util.Estado.Inclusao)
                dgvProdutos.ClearSelection();

            //btnIncluir.Enabled = (Estado == Util.Estado.Nenhum ||
            //                     Estado == Util.Estado.Consulta) ? true : false;

            btnSalvar.Enabled = (Estado == Util.Estado.Alteracao ||
                                 Estado == Util.Estado.Inclusao) ? true : false;

            btnCancelar.Enabled = (Estado == Util.Estado.Alteracao ||
                                 Estado == Util.Estado.Inclusao) ? true : false;

            //btnExcluir.Enabled = (Estado == Util.Estado.Alteracao) ? true : false;

            btnBuscar.Enabled = (Estado == Util.Estado.Nenhum ||
                                 Estado == Util.Estado.Consulta) ? true : false;

            btnLimpar.Enabled = (dgvProdutos.DataSource != null) ? true : false;

            btnExportar.Enabled = (dgvProdutos.DataSource != null) ? true : false;

            dgvProdutos.Enabled = (Estado == Util.Estado.Consulta ||
                                 (Estado == Util.Estado.Nenhum && dgvProdutos.DataSource != null)) ? true : false;
        }
        #endregion Métodos Públicos
    }
}